package cn.itcast.web.controller.cargo;


import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.FileUploadUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {

    @Reference
    private ContractProductService contractProductService;


    @Reference
    private FactoryService factoryService;

    /*
        作用： 进入购销合同的货物列表中
        url:/cargo/contractProduct/list.do?contractId=799b3aa7-773b-4586-a7b3-149547c746d8
     */
    @RequestMapping("/list")
    public String list(String contractId,@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize){
        //1。 查出该购销合同的货物
        ContractProductExample contractProductExample = new ContractProductExample();
        //添加条件，只能查看本公司的货物
        contractProductExample.createCriteria().andContractIdEqualTo(contractId);
        PageInfo<ContractProduct> pageInfo = contractProductService.findByPage(contractProductExample, pageNum, pageSize);
        //存储到请求域中
        request.setAttribute("pageInfo",pageInfo);

        // 2.查出生成货物的生产厂家
        FactoryExample factoryExample = new FactoryExample();
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList",factoryList);
        //3.把购销合同的id存储到域
        request.setAttribute("contractId",contractId);


        return "cargo/product/product-list";
    }


    @Autowired
    private FileUploadUtil fileUploadUtil;


    /*
    作用： 保存添加与修改货物
    路径： /cargo/contractProduct/edit.do
    参数： 货物
    返回值：货物列表
 */
    @RequestMapping("/edit")
    public String edit(ContractProduct contractProduct,MultipartFile productPhoto) throws Exception {//注意： 如果是文件上传字段类型必须是MultipartFile类型
        //1. 给货物补充企业的id与企业名称
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();
        contractProduct.setCompanyId(companyId);
        contractProduct.setCompanyName(companyName);
        //货物的创建人
        contractProduct.setCreateBy(getLoginUser().getId());
        //货物创建人所属部门
        contractProduct.setCreateDept(getLoginUser().getDeptId());

        if(productPhoto.getSize()>0){
            //如果大小大于0则是有上传,把照片保存七牛云上
            String url = fileUploadUtil.upload(productPhoto);
            //把图片的url保存到货物中
            contractProduct.setProductImage("http://"+url);
        }

        //2.根据货物的id判断是否是增加还是修改
        if(StringUtils.isEmpty(contractProduct.getId())){
            //添加
            contractProductService.save(contractProduct);
        }else{
            //修改
            contractProductService.update(contractProduct);
        }
        //3. 返回货物的列表页面
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractProduct.getContractId();
    }


    /*
       作用：进入修改页面
       路径： /cargo/contractProduct/toUpdate.do?id=57f00178-0375-4789-b42c-4e01844fced2
       参数： 货物的id
       返回值：cargo/product/product-update
    */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //1. 根据id查询当前货物
        ContractProduct contractProduct = contractProductService.findById(id);
        request.setAttribute("contractProduct",contractProduct);
        //2. 生成货物的厂家数据
        FactoryExample factoryExample = new FactoryExample();
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList",factoryList);
        //2. 返回更新页面
        return "cargo/product/product-update";
    }

    /*
         作用：删除货物
         路径： /cargo/contractProduct/delete.do?id=${o.id}&contractId=${o.contractId}"
         参数： 货物的id,购销合同的id
         返回值：货物列表
     */
    @RequestMapping("/delete")
    public String delete(String id,String  contractId){
        //1. 删除货物
         contractProductService.delete(id);
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }

    /*
          作用：进入导入货物的页面
          路径： /cargo/contractProduct/toImport.do?contractId=728edde9-2d34-4379-a208-3f7f339f3907
          参数： 购销合同的id
          返回值：cargo/product/product-import
      */
    @RequestMapping("/toImport")
    public String toImport(String  contractId){
        //把购销合同的id存储到域中
        request.setAttribute("contractId",contractId);
        return "cargo/product/product-import";
    }



    /*
          作用：保存excel上传货物数据
          路径： /cargo/contractProduct/import.do
          参数：contractId:  购销合同的id, file: 上传的excel文件
          返回值：货物列表
      */
    @RequestMapping("/import")
    public String importExcel(String  contractId,MultipartFile file) throws IOException {
        //1. 创建工作簿，并且传入上传文件的输入流
        Workbook workbook = new XSSFWorkbook(file.getInputStream());
        //2. 得到工作单
        Sheet sheet = workbook.getSheetAt(0);

        //3. 得到行数
        int rows = sheet.getPhysicalNumberOfRows();

        //4. 遍历所有的行，每一行的数据就是ContractProduct的数据，封装数据
        for (int i = 1; i < rows; i++) {
            Row row = sheet.getRow(i);
            //每一行对应一个货物的对象
            ContractProduct contractProduct = new ContractProduct();

            //厂家的名字
            String  factoryName= row.getCell(1).getStringCellValue();
            if(factoryName!=null){
                //根据厂家的名字查询厂家
                Factory factory = factoryService.findByFactoryName(factoryName);
                contractProduct.setFactoryName(factoryName);
                //补充厂家的id
                contractProduct.setFactoryId(factory.getId());
            }

            //货号
            String  productNO= row.getCell(2).getStringCellValue();
            if(productNO!=null){
                contractProduct.setProductNo(productNO);
            }

            //数量
            Double  cnumber= row.getCell(3).getNumericCellValue();
            if(cnumber!=null){
                contractProduct.setCnumber(cnumber.intValue());
            }


            //包装单位
            String  packingUnit= row.getCell(4).getStringCellValue();
            if(packingUnit!=null){
                contractProduct.setPackingUnit(packingUnit);
            }


            //转率
            Double  loadRate= row.getCell(5).getNumericCellValue();
            if(loadRate!=null){
                contractProduct.setLoadingRate(loadRate+"");
            }


            //箱数
            Double  boxNum= row.getCell(6).getNumericCellValue();
            if(boxNum!=null){
                contractProduct.setBoxNum(boxNum.intValue());
            }

            //单价
            Double  price= row.getCell(7).getNumericCellValue();
            if(price!=null){
                contractProduct.setPrice(price);
            }

            //包装单位
            String  desc= row.getCell(8).getStringCellValue();
            if(desc!=null){
                contractProduct.setProductDesc(desc);
            }


            //包装单位
            String  productRequest= row.getCell(9).getStringCellValue();
            if(productRequest!=null){
                contractProduct.setProductRequest(productRequest);
            }

            //补充数据, 货物所属的购销合同
            contractProduct.setContractId(contractId);
            //添加货物的数据
            contractProductService.save(contractProduct);
        }
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }
}
